"""
TensorFlow基本使用 代码示例
https://www.w3cschool.cn/tensorflow_python/tensorflow_python-fibz28ss.html
"""
import tensorflow as tf

# 创建一个常量 op, 产生一个 1x2 矩阵. 这个 op 被作为一个节点
# 加到默认图中.
#
# 构造器的返回值代表该常量 op 的返回值.
matrix1 = tf.constant([[3., 3.]])

# 创建另外一个常量 op, 产生一个 2x1 矩阵.
matrix2 = tf.constant([[2.], [2.]])

# 创建一个矩阵乘法 matmul op , 把 'matrix1' 和 'matrix2' 作为输入.
# 返回值 'product' 代表矩阵乘法的结果.
product = tf.matmul(matrix1, matrix2)

# 创建一个变量, 初始化为标量 0.
state = tf.Variable(0, name="counter")

# 创建一个 op, 其作用是使 state 增加 1
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# 输入占位符 feed
input1 = tf.placeholder(tf.dtypes.float32)
input2 = tf.placeholder(tf.dtypes.float32)
output = tf.multiply(input1, input2)


# 启动图后, 变量必须先经过`初始化` (init) op 初始化,
# 首先必须增加一个`初始化` op 到图中.
init_op = tf.initialize_all_variables()

# 启动图, 运行 op
with tf.Session() as sess:
    # 运行 'init' op, product, output
    res = sess.run([init_op, product, output], feed_dict={input1:[7.], input2:[2.]})
    print(res)
    # ==> [None, array([[12.]], dtype=float32), array([14.], dtype=float32)]
    # 打印 'state' 的初始值
    res = sess.run(state)
    print(res)
    # 运行 op, 更新 'state', 并打印 'state'
    for _ in range(3):
        res = sess.run(update)
        res = sess.run(state)
        print(res)
    '''
    输出:
    0
    1
    2
    3
    '''